当前位置: 代码迷 >> JavaScript >> 在jsp中如何实现登录后,自动跳转到登录前正浏览的页面?就像csdn的一样
  详细解决方案

在jsp中如何实现登录后,自动跳转到登录前正浏览的页面?就像csdn的一样

热度:323   发布时间:2012-09-09 09:27:54.0
在jsp中怎么实现登录后,自动跳转到登录前正浏览的页面?就像csdn的一样,
在jsp中怎么实现登录后,自动跳转到登录前正浏览的页面?就像csdn的一样,

不管你从哪能个页面登录,成功登录后会自动跳转回那个页面。

解决方法一:

登录处理后,返回如下内容:?? 

?2?PrintWriter?out?=?response.getWriter();
?3?
?4?out.println("<!DOCTYPE?HTML?PUBLIC?""-//W3C//DTD?HTML?4.01?Transitional//EN"">");
?7?
?8?out.println("<HTML>");
?9
11?
12?out.println("??<BODY>");
13?
16?out.println("<script>history.go(-1);history.go(0);</script>");
19?
20?out.println("??</BODY>");
21?
22?out.println("</HTML>");
23?
24?out.flush();
25?
26?out.close();
27?
28?return?null;?
29?
解决方法二:????



1?String?referer?=?req.getHeader("Referer");

2 resp.sendRedirect(referer);
3 return;
4?
5?
上面两种方法不可取是因为,如果用户登录失败,再次登录的话就会出现登录后返回到登录的错误。



第三种:把你要在跳转时需要保存的信息存放在session变量中,登录后清除这个session。可行。

需要登录操作的页面上面添加:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1?<%
2?????if(session.getAttribute("party")==?null){
3?????????if(null?!=?request.getQueryString())
4?????????????session.setAttribute("redirectUrl",?request.getRequestURL().append("?").append(request.getQueryString()).toString());
5?????????else
6?????????????session.setAttribute("redirectUrl",?request.getRequestURL().toString());
7?????????response.sendRedirect(request.getContextPath()?+??"/loginto");
8?????}
9?%>
在登录处理页面:



<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1?String?redirectUrl?=?(String)req.getSession().getAttribute("redirectUrl");
2?????????if(StringUtils.isValid(redirectUrl)){
3?????????????req.getSession().removeAttribute("redirectUrl");
4?????????????resp.sendRedirect(redirectUrl);
5?????????}
第四种方法:写一个servlet会话判断类,如果在线就继续执行,不在线则提示登录。所有的需要在线操作的
servlet都集成此类,这样就不需要上面那么在每个页面写上这些代码了,可以集中控制。这种方式比较完整。



HttpSession?session?=?request.getSession();

if?(session.getAttribute("person")?==?null)?
{
????
if?(null?!=?request.getQueryString())
????????????????session.setAttribute(
"redirectUrl",?request.getRequestURL().append("?").append(request.getQueryString()).toString());
????
else
????????????????session.setAttribute(
"redirectUrl",?request.getRequestURL()
????????????????????????.toString());
???? response.sendRedirect(request.getContextPath()?
+?"/login.jsp");
????
return?null;
?}

return?process(config,?request,?response);

很常见的一个应用就是访问某个页面,因为权限不够,进入登陆页面。人性化的设计是能够在登陆之后,系统跳转到用户原本需要访问的页面。这可以借助拦截器来实现。

在我们验证用户登陆的拦截器里面获取请求地址,并存入session。

package com.tuanplus.interceptor;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

/**
 * 验证用户登陆
 * 
 * @author MZULE
 * 
 */
public class UserLoginInterceptor implements Interceptor {

	private static final long serialVersionUID = 1593745236481514166L;

	public void destroy() {
	}

	public void init() {
	}

	public String intercept(ActionInvocation invocation) throws Exception {
		ActionContext context = invocation.getInvocationContext();
		// 获取session
		Map<String, Object> session = context.getSession();
		Object user = session.get("user");
		// 用户还未登陆
		if (user == null) {
			// 获取HttpServletRequest对象
			HttpServletRequest req = ServletActionContext.getRequest();
			// 获取此请求的地址,请求地址包含application name,进行subString操作,去除application name
			String path = req.getRequestURI().substring(10);
			// 获得请求中的参数
			String queryString = req.getQueryString();
			// 预防空指针
			if (queryString == null) {
				queryString = "";
			}
			// 拼凑得到登陆之前的地址
			String realPath = path + "?" + queryString;
			// 存入session,方便调用
			session.put("prePage", realPath);
			return "login";
		}
		// 用户已经登陆,放行
		return invocation.invoke();
	}

}

在用户登陆的action中加入字符串类型的prePage属性,用来存储拦截器放入session的prePage值(即登陆前的请求地址)。

package com.tuanplus.action;

import com.tuanplus.po.User;
import com.tuanplus.service.IUserService;
import com.tuanplus.util.AuthCodeUtil;

/**
 * 登陆Action
 * 
 * @author MZULE
 * 
 */
public class LoginAction extends BaseAction {

	private static final long serialVersionUID = -6179170126070438432L;
	private IUserService userService;
	private User user;
	//验证码
	private String auth;
	//登录前页面
	private String prePage;

	public String execute() {
		// 获取登陆的User对象
		User seuser = userService.get(user.getEmail());
		// 加入session
		session.put("user", seuser);
		//获取跳转到登陆界面之前的页面地址,由拦截器提供
		prePage = (String) session.get("prePage");
		//清除session中的数据
		session.remove("prePage");
		if (prePage == null) {
			//不是拦截器跳转到登陆页面的,直接访问的登陆页面
			return "myorder";
		} else {
			return SUCCESS;
		}
	}
	...
}

在struts.xml中配置使用action的属性prePage决定物理视图资源。

...
<!-- 登陆 -->
<action name="login" class="loginAction">
	<result type="redirectAction">${prePage}</result>
	<result name="myorder" type="redirectAction">myOrder</result>
	<result name="input">/login.jsp</result>
</action>
...

嗯,一个小技巧,希望对大家有用。

?

我的方法

HttpServletRequest request= (HttpServletRequest)invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
??System.out.println(request.getRequestURI());
??//HttpServletResponse? resp=(HttpServletResponse)invocation.get
//??request.getParameterMap();
??String queryString = request.getQueryString();
??//获取服务器地址
??String basePath = request.getScheme() + "://"
??+ request.getServerName() + ":" + request.getServerPort();


//??// 预防空指针
??if (queryString == null) {
???queryString = "";
??}
??String realPath = request.getRequestURI() + "?" + queryString;
??System.out.println(basePath+realPath);

struts.xml配置

??<interceptors>
???<interceptor name="loginInterceptor" class="com.xinlong.interceptor.LoginInterceptor"></interceptor>
???<interceptor-stack name="baseStack">
????<interceptor-ref name="defaultStack" />
????<interceptor-ref name="loginInterceptor"/>
???</interceptor-stack>
??</interceptors>

?

?<!--用action页面-->
??<action name="showUpload" class="com.xinlong.xinlongmis.front.action.UploadAction" method="showUpload">
???<interceptor-ref name="baseStack"/>
???<result name="success" >/WEB-INF/wenku/uploaddoc.jsp</result>
??</action>?

  相关解决方案