首页 > 其他分享 >用拦截器实现session登录

用拦截器实现session登录

时间:2023-08-27 11:05:19浏览次数:34  
标签:拦截器 登录 session Action import 拦截 com


这个功能是这样的,用户在访问网站时,先要进行登录,即要访问处理登录的Action,若没有登录,即访问除了登录的Action之外的Action,则会被拦截器拦截,跳转到错误页面,提示用户还没有进行登录。

所以这个拦截器的作用是如果是登录,即请求的是LoginAction,那么就不拦截这个请求,让其通过拦截器,进行登录如果请求的是别的Action,若在没有进行登录的情况下,那么拦截器就会起作用,跳转到登录页面,进行登录,若是在登录的情况下,则可以通过拦截器,继续下面操作。

实现这个功能的难点主要在如何让拦截器拦截除了LoginAction之外的其他所有Action。解决这个问题的方法有很多种,可以把这个拦截器引用到所有的除了LoginAction之外的Action,但是有点烦。为了简单一点,所以我们可以为所有的Action定义一个默认的拦截器栈。我们知道在struts.xml中定义的所有Action,都有一个默认的拦截器栈,这个默认的拦截器在struts-default.xml中定义。我们可以先自定义一个拦截器栈,把上面那个拦截登录的拦截器放到这个拦截器栈里面,再把原先的默认的拦截器栈放到自定义的这个拦截器栈。然后把这个拦截器栈设置为默认的拦截器栈,这样自定义的拦截器栈就覆盖了以前的默认拦截器栈,相当于在默认的拦截器栈中多了一个拦截登录的拦截器,即实现了对所有的Action进行拦截的目的,但是这样的话,用来处理登录的LoginAction就会被拦截了,而我们不想让这个Action被拦截,所以还必须在拦截器中做一下判断,若当前是LoginAction,则不进行拦截,让其通过,除此之外,若没有登录的,全部进行拦截,若登录了的,就不拦截。

有点乱吧?看一下示例:

LoginAction.java:

package com.suo.actions;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;
import com.suo.beans.User;
import com.suo.services.LoginService;
import com.suo.services.LoginServiceImpl;

public class LoginAction extends ActionSupport implements Preparable{
	/**
	 * 实现Preparable接口是为了进行Action类的初始化工作,其中的prepare()方法在execute()之前执行
	 */
	
	private String username;
	private String password;
	private LoginService loginService=new LoginServiceImpl();
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String execute()
	{
		if(loginService.isLogin(username, password))
		{//判断用户名和密码是否正确
			User user=new User();
			user.setUsername(username);
			user.setPassword(password);
			
			ActionContext.getContext().getSession().put("userInfo", user);//将这个用户的信息,放在session中,表示进行了登录
			
			return SUCCESS;
		}
		return INPUT;
	}
	@Override
	public void prepare() throws Exception {
		System.out.println("prepare invoke !");
	}
}
拦截器:

package com.suo.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.suo.actions.LoginAction2;

public class LoginInterceptor extends AbstractInterceptor {
	/**
	 * 这个拦截器的作用是如果是登录,即请求的是LoginAction2,那么就不拦截这个请求,让其通过拦截器,进行登录
	 * 如果请求的是别的Action,若在没有进行登录的情况下,那么拦截器就会起作用,跳转到登录页面,进行登录,
	 * 若是在登录的情况下,则可以通过拦截器,继续下面操作。
	 */
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		/**
		 * invocation.getAction()是得到当前访问的Action
		 */
		if(LoginAction2.class==invocation.getAction().getClass())
		{
			return invocation.invoke();
		}
		
		Map map=invocation.getInvocationContext().getSession();//获得session
		
		if(null==map.get("userInfo"))
		{
			return Action.LOGIN;
		}
		
		return invocation.invoke();
	}

}
struts.xml:

<interceptors>
      <interceptor name="loginInterceptor" class="com.suo.interceptor.LoginInterceptor"></interceptor>
	 		
      <interceptor-stack name="myDefaultStack">
		<interceptor-ref name="loginInterceptor"/>
		<interceptor-ref name="defaultStack"/>
      </interceptor-stack>
	 		
</interceptors>
	 	
<default-interceptor-ref name="myDefaultStack"/><!--覆盖掉原来的默认拦截器,注意,这个要放在interceptors的外面-->

注意,拦截器中,若没有登录,就返回Action.LOGIN,这个返回的结果页面应该是全局的,因为请求被拦截了,还没有进入到Action中,所以不能返回到struts.xml中action中定义的结果页面。





标签:拦截器,登录,session,Action,import,拦截,com
From: https://blog.51cto.com/u_5173797/7251428

相关文章

  • 实现拦截器的三种方法
    说是三种方法,实际上是一种方法,其实只要这个类实现了Interceptor接口,即可成为一个拦截器类。第一种方法就是直接实现Interceptor接口,这样的话,就要实现这个接口中的三个方法。第二种方法是继承自AbstractInterceptor类,这是个抽象类,实现了Interceptor接口,并且对里面的init()和destroy(......
  • Struts2 中拦截器和Action的调用关系
    所谓的拦截器就是指实现了Interceptor接口的类,该接口中定义了三个方法:init(),destroy(),intercept()。init()用于在服务器启动的时候,初始化这个拦截器。destroy()用于清理分配给拦截器的资源,intercept()是用来起拦截作用的,这个方法还有一个ActionInvocation类型的参数invocation,并且......
  • python如何提取浏览器中保存的网站登录用户名密码
    python如何提取Chrome中的保存的网站登录用户名密码?很多浏览器都贴心地提供了保存用户密码功能,用户一旦开启,就不需要每次都输入用户名、密码,非常方便。作为python脚本,能否拿到用户提前保存在浏览器中的用户名密码,用以自动登录呢?必须有,小爬已经提前踩过很多坑,找到了可行的......
  • 在登陆界面实现按回车后登录
    概述主要有三种实现方式在<body>属性中添加代码:添加JS绑定在定义了type=submit按钮标签下,使用@keyup.enter="submit"具体实现方式:一、在<body>属性中添加代码onkeydown="if(event.keyCode===13)document.all.login.click()"二、添加JS绑定<script>$(d......
  • 学会Python Requests库+Cookies模拟自动登录!
    importrequestsurl="https://my.cheshi.com/user/"headers={"User-Agent":"Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGecko)Chrome/116.0.0.0Safari/537.36"}res=requests.get(......
  • SecureCRT通过脚本实现自动化登录
    1、配置登录主机名、用户和密码 2、配置登录后操作脚本目录 3、vbs操作脚本如下(crt也支持python)#$language="VBScript"#$interface="1.0"crt.Screen.Synchronous=TrueSubMain crt.Screen.Send"[email protected]"&chr(13) if(crt.Screen.Wait......
  • 过滤器| 拦截器| 监听器的区别与使用
    骑士李四记录:1.过滤器(Filter):过滤器依赖于servlet容器。在实现上基于函数回调。几乎可以对所有请求进行过滤。缺点是一个过滤器实例只能在容器初始化时调用一次。2.拦截器(Interceptor)拦截器依赖于web框架,在SpringMVC中依赖于SpringMVC框架。实现上基于java反射机制,属于面向切......
  • 单点登录的原理
    1.http无状态协议web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系2.会话机制浏览器第一次请求服务器,服务器创建一个会话,并将会话的id作......
  • redis实现用于限制非法登录
    redis实现用于限制非法登录次数为5次,锁定10分钟,并设置登录连接超时时间为10分钟要使用Redis实现限制非法登录次数、锁定和设置登录连接超时时间,可以结合Redis的计数器(counter)、设置过期时间(expire)和获取剩余有效时间(ttl)的功能。下面是一个示例的Java代码,使用Redis来实现这......
  • 登录和注册功能的实现
    本来使用flask框架制作网页并实现登录和注册在几天前就已经实现了,不过当时没有设计到一些数据库之间的关联,而且使用了的是pymysql并且反复的打开数据库的方式。现在这次使用的是数据库池的方式,然后不同的数据库之间也设定了外键。importpymysqlfromdbutils.pooled_dbimport......