`

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

    博客分类:
  • java
 
阅读更多
在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> 

分享到:
评论

相关推荐

    JSP之使用jsp:forward实现用户信息验证的页面跳转

    JSP之使用jsp:forward实现用户信息验证的页面跳转 参考博客地址:https://blog.csdn.net/qq_36631076/article/details/79709868

    WebView_jsp页面跳转到原生Activity

    WebView_jsp页面跳转到原生Activity , 详情请参见 https://blog.csdn.net/aduovip/article/details/86383086

    过滤器的一个登录demo

    比如说:在一个学校的教育管理系统中,你想看到该学校的课程信息MyClassInfor.jsp,必须先登录验证通过才能访问站内的资源,如果你直接访问MyClassInfor.jsp这个页面,那么系统一般会跳转到登录页面让你去登录。...

    jsp跳转详情

    jsp的跳转方法

    组件技术-设计- 简单的登录注册案例+留言板实现+txt文本存储实现成语接龙(包含两周内免登陆)

    用过滤器实现session的检查以此防止用户非法登录,并使用过滤器通过cookie进行检查其登录是否与数据库信息正确。成功登录页面包含用户账号密码,计数器即第几次登录,返回重新登录的跳转链接,上次访问时间。 其中...

    js跳转页面方法实现汇总

    秒后自动跳转……&lt;meta http-equiv=refresh content=3;url=’/search/billsearch.jsp'&lt;/ul&gt; [removed] function countDown(secs){ tiao.innerText=secs; if(–secs&gt;0) setTimeout(“countDown(“+secs+”)”,1000...

    基于SSH的客户关系CRM管理系统设计与实现.7z

    本系统的jsp页面都放置在项目目录中的WEB-INF中,此目录下的页面在外部是无法通过网址访问的,只有通过系统内部的跳转才能访问,安全性有所提高。此外本系统还是用MD5为登录密码加密,MD5加密后的密码是不可逆的,...

    400个DreamWeaver插件

    mxp/使页面中的图片都恢复到原始大小,可以作用到单个页面或者整个站点,甚至是site窗口选中的页面 mxp/平常插入的文本框都是白底黑字,如果要改变,就要用CSS定义,很麻烦。这个插件可以直接插入彩色的文本框 mxp/...

    基于jsp+servlet+mysql三层架构实现的网上书店系统源码+项目说明.zip

    基于jsp+servlet+mysql三层架构实现的网上书店系统源码+项目说明.zip # BookStoreSystem 基于 jsp + servlet + mysql 三层架构实现的网上书店系统 ## 一、前言 该系统是简单的模仿 当当网 书店系统,==分为前端和...

    最详细的jsp基础教程

    JSP系列教材 (五)- 服务端跳转和客户端跳转 JSP系列教材 (六)- 中演示 cookie 的创建和访问 JSP系列教材 (七)- session 详解 JSP系列教材 (八)- 四种作用域 JSP系列教材 (九)- 九种隐式对象 JSP系列教材 ...

    jsp网上购物系统源码

    网上购物系统源码,使用hibernate实现的数据库连接和struts实现的流程跳转

    学生选课系统

    不进行页面跳转,主要是练习运用jquerty,ajax,里面包含数据库,只是界面不太美观,如果要嵌入别到的网页上,出现问题欢迎在我的博客留言,或者加我qq1005089371,嵌入到别的网页如果部分列表或功能无法实现,请尝试...

    Javascript实现返回上一页面并刷新的小例子

    今天写了一个小小的提示成功的页面,同时要求返回上一...经过在JSP页面的测试,在操作页面选中添加的项经过点击按钮保存再跳转到成功提示页面返回后发现都没有刷新,手动刷新后才显示出来,对于那些粘贴复制技术不经过

    Java面试宝典-经典

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...

    题目:慧心人力资源管理系统,美和易思JavaWeb机试考试试卷.docx

    6.点击每行更新链接后跳转到更新页面,更新界面显示出要修改的员工信息,更新成功后跳转到首页显示最新数据,如图8、9所示: 实现代码:https://blog.csdn.net/weixin_44893902/article/details/115393694

    mvcTest代码

    (3)跳转到另一个显示界面queryResult.jsp,并把查询的结果传递过去 4. 编写studentDao.java的代码,主要完成数据库的init和close,以及根据名字进行查询的相关函数 5. 编写queryResult.jsp的代码,主要接收...

    完美解决iframe跨域问题

    框架完美解决了iframe之间的跨域通讯。底层技术采用window.name转换代理实现

    java面试题

    答:在Struts2里面是将每次页面的请求进行处理,然后将请求需要输出的数据转发到需要做数据显示的页面。Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将...

    计算机毕业设计源码Springboot旅游网站系统

    具体在系统设计上,采用了B/S的结构,同时,也使用jsp技术在动态页面上进行了设计,后台上采用Mysql数据库,是一个非常优秀的旅游网站系统。 关键词 :旅游网站系统;jsp技术;Mysql数据库;B/S结构

    shiroFilter权限验证

    -- 若想更明显的测试此属性可以修改它的值,如unauthor.jsp,然后用[玄玉]登录后访问/admin/listUser.jsp就看见浏览器会显示unauthor.jsp --&gt; /&gt; &lt;!-- Shiro连接约束配置,即过滤链的定义 --&gt; &lt;!--...

Global site tag (gtag.js) - Google Analytics