struts1.X可是说是java开源社区最最经典的一个框架了。虽然业界spring,webwork加上apache最近推出的转型于webwork的struts2.0如火如荼,但是struts1.x以其独有的流程控制优势,在一段时间内仍会屹立于开源社区领域。现将在项目中积累的一些心得拿出来和大家共享,水平有限,有碍方家法眼。
在struts,一般的扩展点在org.apache.struts.action.RequestProcessor上,里面的processPreprocess()和processRoles ()两个方法可以由用户根据需求来扩展。本例中,我们在processPreprocess()实现判断用户是否登陆,在processRoles()中判断用户是否有权限请求此Action。此例设计实现为:在数据库中,用户表有一个字段为100位二进制位,每一位对应一个功能,为0则没有此功能,为1则有。
新建action:
<action input="/template/user/modiEmployee.ftl" roles="1,2,3" name="systemUserForm" path="/updateSysUser" scope="request" type="com.test.sysuser.UpdateSysUser" validate="true"/>
另外在struts-config.xml中加入:
<controller nocache="true" inputForward="false" maxFileSize="2M" contentType="text/html;charset=GB2312" processorClass="com.test.common.CustomRequestProcessor"/>
此action的roles属性为1,2,3,代表用户权限位中前1,2,3位其中一位或多位为1的时候才有权限访问此action.
下面为扩展RequestProcessor类。
package com.test.common;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.RequestProcessor;
public class CustomRequestProcessor extends RequestProcessor {
protected boolean processPreprocess(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
if (request.getServletPath().equals("/manage/login.jsp")//设置哪些目录不需要登陆就可以访问.
|| request.getServletPath().equals("/sysUserLogin.do") || request.getServletPath().equals("/manage/exitManage.do") ) {
return true;
}
if (session != null && session.getAttribute("Admin_Username") != null) {
return true;//用户已登陆,返回true;
} else {
try {//否则,转发到登陆页
request.getRequestDispatcher("/template/user/LoginDoor.ftl")
.forward(request, response);
} catch (Exception ex) {
ex.printStackTrace();
}
}
return false;
}
protected boolean processRoles(HttpServletRequest request,HttpServletResponse response, ActionMapping mapping)throws IOException, ServletException {
String roles[] = mapping.getRoleNames();//取得此用户的权限数组.
if (roles == null || roles.length < 1) {
return true;//roles为空,表示任何人都可以访问此action
}
HttpSession session = request.getSession();
//从session中取出用户权限字符串,如:1010111101.....
String permission = (String)session.getAttribute("Admin_Permission");
if(permission == null) permission = "";
for (int i = 0; i < roles.length; i++) { //判断用户是否有权限.
if(permission.charAt(Integer.parseInt(roles[i])-1) == '1'){
return true;//有权限,返回.
}
}
response.sendRedirect("/template/NoPermission.ftl"); //转到提示无权限页.
return false;
}
}
至此,在浏览器中输入:http://localhost:8080/updateSysUser.do ,则在请求之前,会自动执行上面写的两个方法进行验证。
最新java交流群:38366664 38366732 14061272 16183902 38545283 5952964