struts2 拦截器实现登录控制

花费半天研究了一下struts拦截器实现登录验证。做下笔记

 附上源码

 

  • 搭建struts2环境,新建web工程,导入struts的jar包: 

     
  • 编辑web.xml,配置struts。在src下配置struts.xml配置文件
<package name="haslogin" extends="struts-default">
		<interceptors>
			<!--定义一个名为loginintercetor的拦截器-->
			<interceptor name="loginintercetor" class="com.tch.interceptor.LoginInterceptor"></interceptor>
			<!--定义一个包含权限检查的拦截器栈-->
			<interceptor-stack name="myStack">
				<!--配置自定义的拦截器-->
				<interceptor-ref name="loginintercetor"></interceptor-ref>
				<!--配置内建默认拦截器-->
				<interceptor-ref name="defaultStack"></interceptor-ref>         
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="myStack"></default-interceptor-ref>
		<global-results >
			<result name="login">/WEB-INF/jsp/manage/login.jsp</result>
		</global-results>
	</package>

其他包引用haslogin,会使用登录和权限控制用到的拦截器loginintercetor

 

  • 编写拦截器类LoginInterceptor.java
package com.tch.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoginInterceptor extends AbstractInterceptor 
{

	@Override
	public String intercept(ActionInvocation invocation) throws Exception 
	{
		Map<String, Object> session= invocation.getInvocationContext().getSession();
		if (session.get("username")==null)
        {
            return  "login";
        }
		
		return invocation.invoke();
	}

}

 从session中获取登录信息,若有登录用户则继续访问;若没有返回登录,访问global-results。

 

 

  • 配置登录登出的action
<package name="manage" namespace="/manage" extends="haslogin">
    	<!-- 登录和登出不需要拦截,可单独配置interceptor-ref拦截器为defaultStack -->
    	<action name="login" class="com.tch.action.LoginAction" method="manageUserLogin">
	    	<!-- 配置type="redirect"会重定向,也就是url地址栏地址会变化 -->
	    	<result name="success" type="redirect">index.action</result>
	    	<interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
        <action name="loginOut" class="com.tch.action.LoginAction" method="manageUserLoginOut">
	    	<interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
        <action name="index" class="com.tch.action.LoginAction" method="goToIndex">
        	<result name="success">/WEB-INF/jsp/manage/index.jsp</result>
        </action>
    </package>

将jsp文件放在 WEB-INF下,出于安全性考虑,防止绕过struts直接访问jsp文件。

 

 

  • 最后再说一下jsp文件里action路径问题

我struts配置的action配置在namespace="/manage"下,index.jsp如下

 

 

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
<body>
    欢迎<%= session.getAttribute("username")%>
    <form action="manage/loginOut">
    	<button type="submit" value="">退出登录</button>
    </form>
  </body>

 命名空间是  namespace="/XXX"  那你form表单中的action应该是
action=XXX/UserLogin.action  最前面没有  /   因为struts2的web.xml 的核心控制器里的
url-pattern  是/* 就是所有的action 都是以/开头  所以表单中的action 属性 = 命名空间/ Action名字.后缀

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值