登陆后返回正在游览页面

本文介绍在JSP中实现登录后自动跳转至登录前页面的方法,包括使用history对象、Referer头信息、Session变量及拦截器等技术。
在jsp中怎么实现登录后,自动跳转到登录前正浏览的页面?就像希赛的一样,

  在jsp中怎么实现登录后,自动跳转到登录前正浏览的页面?就像希赛的一样,不管你从哪能个页面登录,成功登录后会自动跳转回那个页面。解决方法一:登录处理后,返回如下内容: 

  2 PrintWriter out = response.getWriter();
3
4 out.println("<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN""$amp;>quot;$);
7
8 out.println("<HTML$amp;>quot;$);
9
11
12 out.println(" <BODY$amp;>quot;$);
13
16 out.println("<script>history.go(-1);history.go(0);</script$amp;>quot;$);
19
20 out.println(" </BODY$amp;>quot;$);
21
22 out.println("</HTML$amp;>quot;$);
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 /> ;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 /> ;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();// 获取sessionMap<String, Object> session = context.getSession();Object user = session.get("user");// 用户还未登陆if (user == null) {// 获取HttpServletRequest对象HttpServletRequest req = ServletActionContext.getRequest();// 获取此请求的地址,请求地址包含application name,进行subString操作,去除application nameString 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());// 加入sessionsession.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"$amp;>{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"$amp;>amp;$lt;/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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值