我写过的一些代码,你做下参考在用户登陆时,设置2个session
session.setAttribute("login","true");//简单的判断登陆状态,可以在表里做个字段,登陆时改那个字段的值也可以;
session.setAttribute("userGroup","admin");//登陆时根据表里的用户组ID,来定义不同的SESSION值;在一个类文件中定义一个获取用户组信息的方法:
public String checkUserGroup(int userGroupID){
String msg=null;
switch(userGroupID){
case 0: msg = "admin";break;
case 1: msg = "user";break;
default : msg = "guest";//可以根据需求加用户组
}
return msg;
}
}//end checkUserGroup 在登陆的servlet或JSP页里使这个方法就可以得到相应的组名了;用这2个SESSION值来判断用户的状态和组;再写一个filter,doFilter方法大致如下
public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
{
HttpServletRequest hreq = (HttpServletRequest)req;
HttpServletResponse hres = (HttpServletResponse)res;
HttpSession session = hreq.getSession();
String isAdmin = null;
try{
isAdmin = (String)session.getAttribute("userGroup");//获得页面的session值
if(!(isAdmin==null) && isAdmin.equals("admin") ){//判断其是管理员则放行;
chain.doFilter(req,res);
}else{
System.out.println("is not admin");//测试使
hres.sendRedirect(error_page.jsp);
}
}catch(Exception e){
e.printStackTrace();
}
}//end doFilter写好过滤器后,去项目的web.xml里进行filter的设置,设置其要进行保护的文件夹:
<filter>
<filter-name>CheckAdminGroup</filter-name>
<filter-class>bookshop.filter.CheckAdminGroup</filter-class>
</filter>
<filter-mapping>
<filter-name>CheckAdminGroup</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CheckAdminGroup</filter-name>
<url-pattern>/secret/*</url-pattern>
</filter-mapping>这样你在admin,secret里的所有资源,就都被这个过滤器保护起来了,一个过滤器可以对多个资源进行保护,你就按这样的思路,再写个判断用户是否登陆,和一个用户是否属于用户组的过滤器,就实现权限分级了;
session.setAttribute("login","true");//简单的判断登陆状态,可以在表里做个字段,登陆时改那个字段的值也可以;
session.setAttribute("userGroup","admin");//登陆时根据表里的用户组ID,来定义不同的SESSION值;在一个类文件中定义一个获取用户组信息的方法:
public String checkUserGroup(int userGroupID){
String msg=null;
switch(userGroupID){
case 0: msg = "admin";break;
case 1: msg = "user";break;
default : msg = "guest";//可以根据需求加用户组
}
return msg;
}
}//end checkUserGroup 在登陆的servlet或JSP页里使这个方法就可以得到相应的组名了;用这2个SESSION值来判断用户的状态和组;再写一个filter,doFilter方法大致如下
public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
{
HttpServletRequest hreq = (HttpServletRequest)req;
HttpServletResponse hres = (HttpServletResponse)res;
HttpSession session = hreq.getSession();
String isAdmin = null;
try{
isAdmin = (String)session.getAttribute("userGroup");//获得页面的session值
if(!(isAdmin==null) && isAdmin.equals("admin") ){//判断其是管理员则放行;
chain.doFilter(req,res);
}else{
System.out.println("is not admin");//测试使
hres.sendRedirect(error_page.jsp);
}
}catch(Exception e){
e.printStackTrace();
}
}//end doFilter写好过滤器后,去项目的web.xml里进行filter的设置,设置其要进行保护的文件夹:
<filter>
<filter-name>CheckAdminGroup</filter-name>
<filter-class>bookshop.filter.CheckAdminGroup</filter-class>
</filter>
<filter-mapping>
<filter-name>CheckAdminGroup</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CheckAdminGroup</filter-name>
<url-pattern>/secret/*</url-pattern>
</filter-mapping>这样你在admin,secret里的所有资源,就都被这个过滤器保护起来了,一个过滤器可以对多个资源进行保护,你就按这样的思路,再写个判断用户是否登陆,和一个用户是否属于用户组的过滤器,就实现权限分级了;
用户登陆时,组的session设置:
int userGroup = 你从库中提出的值;
session.setAttribute("userGroup",new MyClass().checkUserGroup(userGroup));
然后例子你就照着:tomcat\webapps\examples\WEB-INF\web.xml
下的<security-constraint>这部分配就好了
cnfalcon(中国猎鹰)我前面的问题在http://community.csdn.net/Expert/topic/3690/3690125.xml?temp=.69331
MopeLeo(烂迹天涯)因为时间紧迫我也想先这么做 可是BOSS不答应!-_-我想我没说清楚吧。现在我手头有用户表(user)、用户对应角色表(usermappingrole)、用户对应操作表(usermappingoperation)、角色表(role)、角色对应操作表(rolemappingoperation)、操作表(operation)、名单(employee)7个表。
我对权限设置具体步骤不是很了解,现在得按BOSS的意图写。尽量帮帮我吧!我想问的是:
1。一开始,我想用一个二进制数组对应权限(因为划分等级较多以及考虑可扩展性)。这里二进制如何转换十进制呢?希望有例子。(翻遍CSDN只找到可用的十进制转二进制的语句,可惜这里没用)
比如我设定了除admin之外的6级权限(比如0000 0000 对应一级),那么我要定义一个有6个部分的二进制数组吧。那么我把数组转换为十进制的数字串后,用什么方法使对应等级的用户获得这个数字串呢
2。谁了解表之间的对应还有映射关系,能不能介绍一下。
3。看了别人的帖子,好象权限可以以树结构来一级级关联起来(比如superadmin->admin->),但是都是讲方法没有具体的说,能否给出简单的示例、方法来?
4。设定好各级权限后怎样使各级别只能看到权限内的页面或者数据(不明白其中的具体方法和语句)
5。设定好各级权限后,怎样使各级别只能执行相应的操作(添加删除等)也是不明白方法语句
6。具体要改动或者添加哪里的baen和XML?(除了上面大大说的以外)还需要写什么类呢?
7。我对过滤器还不是很熟悉,大大帮忙写个简单的判断用户是否登陆,和一个用户是否属于用户组的过滤器行吗?
8。父 -》子 -》位置 逻辑上来设计具体如何实现,能否给个例子
9。页面上写好权限语句,那么我这个划分级别的方法怎么通过父 -》子 -》位置 和数据库的表对应起来呢?
10。很简单的问题,就是不明白:登陆页面中只有用户ID和PWD,如何通过SESSION与权限绑定并在所有页面里起到作用?(首先就是不明白传递ID和PWD的SESSION写法)。先想到这些,半夜提问语无伦次,希望表尽情的BS我啊,分不多,差不多这次就散干净了,希望能抛砖引玉。
还有为了便于管理,最好有角色作为权限的载体,一个用户实际的权限可以这样组成:专门分配给他的和他所具有的所有角色的权限合集.
这是我上一个工程的权限模块的大体做法,在此抛砖引玉........希望得到大家的指正......
/*
判断发送请求的用户,是否已登陆
*/
package bookshop.filter;import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;public class ConfirmLogin extends HttpServlet implements Filter{
String error_page = "/bookshop/error";
private FilterConfig filterConfig;
/*
做主要的过滤动作
*/
public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
{
HttpServletRequest hreq = (HttpServletRequest)req;
HttpServletResponse hres = (HttpServletResponse)res;
HttpSession session = hreq.getSession();
String loginPass = null;
try{
loginPass = (String)session.getAttribute("login");//这里的login是在用户登陆时打进session的值 if(!(loginPass==null) && loginPass.equals("true") ){
chain.doFilter(req,res);
}else{
hres.sendRedirect(error_page);
}
}catch(Exception e){
e.printStackTrace();
}
}
/*
初始化
*/
public void init(FilterConfig config)throws ServletException{
this.filterConfig = config;
} /*
销毁过滤器
*/
public void destroy(){
this.filterConfig = null;
}
}---------------------------------------------------
编译后再去你项目的WEB-INF下设置web.xml
<filter>
<filter-name>confirmLogin</filter-name>
<filter-class>bookshop.filter.ConfirmLogin</filter-class>
</filter>
<filter-mapping>
<filter-name>confirmLogin</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping><filter-mapping>
<filter-name>confirmLogin</filter-name>
<url-pattern>/user/*</url-pattern>
</filter-mapping><filter>标是对你的过滤器类文件的定义,然后在<filter-mapping>中使用你定义的虚拟名称来对要保护的资源地址进行定义,可以是多个,也可以是servlet;这样再配合上面说的权限判定的filter,就可以实现权限分级了;不过后来想想这样还是麻烦,要为每一组的用户都写一个filter……这样写还是为了练练手,新人嘛~~~再来看你的表结构:用户对应操作表(usermappingoperation)<--这个表是做什么用的?记录用户操作时的参数?做数据库操作时,用Hibernate会好点吧,但还是老问题。。我也刚开始看这东西我最近刚写了一个多表操作的模块,实现的方法也还是比较笨供你参考下吧:每个表对应2个类文件,一个是set && get的方法,另一个是对这个表的所有操作,例如:删除,插入,更新等;
首先是set && get的类,用来做传递数据使:
package myProject.sample;import java.io.*;public class User implements Serializable{
//每个变量对应表的字段,名字尽量一样
private int userID;
private String userName;
private int userGroupID;
//每个变量对应set && get方法,进行存取,字段的排列也尽量和表的一致
public void setUserID(int id){
this.userID = id;
}
public int getUserID(){
this.userID;
}
public void setuserName(String name){
this.userName = name.trim();
}
public int getUserName(){
this.userName;
}
public void setUserGroupID(int id){
this.userGroupID = id;
}
public int getUserGroupID(){
this.userGroupID;
}
}
-------------------------------------------
然后去写个对应用户表的操作类:
package myProject.sample;import java.sql.*;public class UserManager{
private Connection conn;//这个用来创建连接数据库
private PreparedStatement pstmt;
private ResultSet rst;
//实例化时获得一个连接
public UserManager(){
//这个方法是写在数据库连接的类里,方法是静态的
conn = DBConnection.getConnection();
}
/*
插入一条用户记录
*/
public void addUser(User userInfo){//这里接收的对象,需要是User的
try{
pstmt = conn.prepareStatement("insert into user(userid,username,usergroupid) values(?,?,?)");
pstmt.setInt(1,userInfo.getUserID());//这里就是刚才写的方法
pstmt.setString(1,userInfo.getUserName());
pstmt.setString(1,userInfo.getUserGroupID()); pstmt.execute();
}catch(Exception ex){
}finally{
try{
conn.close();
}catch(SQLException ex){
}
}//end finally block
}//end addUser method
}
----------------------------------------------
这样你在servlet或JSP里写时,只要实例化这2个类,然后,再把相应的值,该转的转,该限制的限制后,就可以插进库里了;
User user = new User();
UserManager userManager = new UserManager();
//接前页的值
int userID = Integer.parseInt(req.getParameter("userID"));
String userName = req.getParameter("userName");
int userGrpID = Integer.parseInt(req.getParameter("userGroupID"));
//将三个值分别设置进User
user.setUserID(userID);
user.setUserName(userName);
user.setUserGroupID(userGrpID);
//然后调用刚写好的方法,将其插进表里
userManager.addUser(user);OK,搞定,其他的地方都是细节的了,大体的操作都是如此;要注意的就是,象这样写的操作表的类,在同一servlet里使时,要每次调用方法,就创建一个新的实例,因为每次操作结束,连接都会被关掉,为这问题我郁闷了8小时进去……教训呀…… 最好写个创建实例的类,每次取实例都去那里调条方法出来就OK了~~~
pstmt.setInt(1,userInfo.getUserID());
pstmt.setString(1,userInfo.getUserName());
pstmt.setString(1,userInfo.getUserGroupID());
改成:
pstmt.setInt(1,userInfo.getUserID());//这里就是刚才写的方法
pstmt.setString(2,userInfo.getUserName());
pstmt.setString(3,userInfo.getUserGroupID());