菜鸟小项目_拦截器的应用

需求:

  我们在处理用户登录时,不希望用户在没登录的情况下访问某些资源,此处我们可以使用拦截器来达到我们的目的

实现步骤:

1、编写login.jsp

<body>
  <h2>用户登录</h2>
  ${loginError}
    <form action="login.action" method="post">//将用户的信息提交给login.action进行校验
	用户名:<input type="text" name="username">
    	密码:   <input type="password" name="password">
    	        <input type="submit" value="登录">
     </form>
  </body>
2、配置Struts.xml

前面表单中的提交到login.action其实就是struts.xml中配置的action的名字

<action name="login" class="com.imooc.actiom.loginAction" method="login">
	<result>/WEB-INF/page/manager.jsp</result>
	<result name="login">/login.jsp</result>
    <!--<interceptor-ref name="myInterceptorStack"></interceptor-ref>-->//此处如果也加上后面定义的拦截器栈,则会无法登陆,因为执行login.action之前都会<pre name="code" class="plain">
//经过拦截器,此时session里面还没有值,所以会一直返回到login.jsp上,故,此处不能加
</action>

 


</pre><pre>
3、编写 com.actiom.loginAction.java

public class loginAction extends ActionSupport implements SessionAware{
	
	private String username;
	private String password;
	private Map<String, Object> sessiona;//由于我们用到了session所以实现了SessionAware接口并重写了setSession方法
</span>

	@Override
	public void setSession(Map<String, Object> session) {
		// TODO Auto-generated method stub
		this.sessiona=session;
		
		
	}
	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 login(){//这就是我们前面struts中配置的login方法
		System.out.println("bbbbbbbbbbbbbb");
		
		if("admin".equals(username)&&"123".equals(password)){
			sessiona.put("logInfo", username);//将用户信息保存到session中
			return SUCCESS;
		}else{
			
			sessiona.put("loginError", "用户名或密码不正确");
			return ERROR;
			
			
		}
		
		
	}
}

3、由于我们访问的页面在/WEB-INF下,直接访问不到所以我们需要一个action去访问,接着配置struts.xml

<action name="auth">
	<result>/WEB-INF/page/manager.jsp</result>//返回SUCCESS字符串是调用manager.jsp
	<result name="<span style="color:#ff0000;">login</span>">/login.jsp</result>//返回login字符串时调用login.jsp
	<!-- 引用自定义的拦截器栈 -->
	<interceptor-ref name="myInterceptorStack"></interceptor-ref>//在没有此处的拦截器栈的话,用户可以直接通过localhost:8080/项目名/auth.ation                                                                             //去访问manager.jsp,此处接第6步
</action>

 4、编写拦截器 
public class AuthInterceptor extends <span style="background-color: rgb(204, 204, 204);"><span style="color:#ff0000;">AbstractInterceptor </span></span>{

	@Override
	public String <span style="color:#ff0000;">intercept</span>(ActionInvocation invacation) throws Exception {
		
		ActionContext context=ActionContext.getContext();//获取ActionContext以获得session
		System.out.println("aaaaaaaa");
		Map<String, Object> session=context.getSession();
		if(session.get("logInfo")!=null){//如果session中不为空说明用户已经登录(此处是用户直接通过localhost:8080/项目名/auth.ation来访问资源时才会通过拦截器,正常登录的情况下不经过拦截器)<pre name="code" class="plain">

String result=invacation.invoke();//得到一个字符串的结果SUCCESS
</pre><span style="font-family: Arial, Helvetica, sans-serif;">                                return result;</span>

 }else{return "login";//如果session为空说明用户没有登录,返回字符串login,见第3步}}} 
 

5、编写好了拦截器还不算完,编写完得用,用的话必须要到struts.xml中去注册拦截器

<interceptors>
	<interceptor name="auth" class="com.imooc.interceptor.AuthInterceptor"></interceptor>//注册拦截器
	<!-- 自定义的拦截器栈 -->
	<interceptor-stack name="myInterceptorStack">//将自己注册拦截器和默认的拦截器组合成拦截器栈
		<interceptor-ref name="defaultStack"></interceptor-ref> 
		<interceptor-ref name="auth"></interceptor-ref>
	</interceptor-stack>
		
</interceptors>
6、注册了拦截器之后,我们还要去struts.xml中具体的action中去引用拦截器(见第3步)


完成了上面的步骤之后,基本上实现了一个简单地拦截器的应用,但是自己还是有些不太明白这个拦截器和servlet的具体应用上的不同,以后补充






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值