在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>
本文介绍在JSP中实现登录后自动跳转至登录前页面的方法,包括使用history对象、Referer头信息、Session变量及拦截器等技术。
2万+

被折叠的 条评论
为什么被折叠?



