您现在的位置是:首页 > 电脑技术查询 > web开发

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

编辑:chaxungu时间:2022-10-10 23:24:33分类:web开发

在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;

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();// 获取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">${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>