当前位置: 技术问答>java相关
欢迎讨论JSP模式中的权限控制!!!!
来源: 互联网 发布时间:2017-04-03
本文导语: 我最近用J2EE框架做了一个移动项目,发现权限控制没有做好, 我现在是这样做的,在每一个页面中设置一个标签,对应一个功能号, 登录后权限字符串存在session中,然后在标签中判断本页面对应的功能 是否存在字...
我最近用J2EE框架做了一个移动项目,发现权限控制没有做好,
我现在是这样做的,在每一个页面中设置一个标签,对应一个功能号,
登录后权限字符串存在session中,然后在标签中判断本页面对应的功能
是否存在字符串中,这样的话,页面多了,维护不方便,
请高手参与讨论
我现在是这样做的,在每一个页面中设置一个标签,对应一个功能号,
登录后权限字符串存在session中,然后在标签中判断本页面对应的功能
是否存在字符串中,这样的话,页面多了,维护不方便,
请高手参与讨论
|
采用MVC模式,权限放在数据库中,调有底层的时候如果没有权限,则在Controller中捕获异常,重定向道出错页面给可以!并且,这种方式可以单独抽象出来权限控制模块,有利于复用!可以设计一个User对象!
在大型的项目中,这个方法很有效!
在大型的项目中,这个方法很有效!
|
同意BOVY。
用servlet作为controller,权限存放在数据库里,
建立user对象,页面提交到servlet,进行权限判断,然后重定向。
这样,每个功能各自独立,比较容易做。
用servlet作为controller,权限存放在数据库里,
建立user对象,页面提交到servlet,进行权限判断,然后重定向。
这样,每个功能各自独立,比较容易做。
|
关于jsp页面的权限管理应该存在一个层次:
我现在把它们分为三个层次
1 应用或目录的访问权,主要是通过判断是否登陆来决定,同时获得用户登陆信息。这个实现通过配置jsp web server的安全管理来实现,在tomcat下已经提供了三种模式来实现,一般不必编程。只需配置就可以了。
2 判断用户是否对具体页面有访问权,我认为在Filter中实现比较好,如果使用controller模式,就无法通过url直接访问资源,必须通过转发,但是页面上访问的资源种类多有图形、css文件、js文件等等,这样要不就是服务器端配置比较乱,要不就是写页面时候比较麻烦。
3 判断用户对数据或功能的权限,就必须写在页面中了。
我现在把它们分为三个层次
1 应用或目录的访问权,主要是通过判断是否登陆来决定,同时获得用户登陆信息。这个实现通过配置jsp web server的安全管理来实现,在tomcat下已经提供了三种模式来实现,一般不必编程。只需配置就可以了。
2 判断用户是否对具体页面有访问权,我认为在Filter中实现比较好,如果使用controller模式,就无法通过url直接访问资源,必须通过转发,但是页面上访问的资源种类多有图形、css文件、js文件等等,这样要不就是服务器端配置比较乱,要不就是写页面时候比较麻烦。
3 判断用户对数据或功能的权限,就必须写在页面中了。
|
这是我在Filter实现权限控制的模式
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class PurviewFilter implements Filter {
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
HttpServletRequest req = (HttpServletRequest)request;
String userName =req.getRemoteUser();
String resourcePath= req.getRequestURI();
if(userName==null)
{
//没有登录用户处理
//return;
}
if(!verifyUser(userName,resourcePath))
{
//用户没有资源使用权限处理
// return;
}
chain.doFilter(request,response);
}
}
private boolean verifyUser(String userName,String resourcePath)
{
//在这里填写校验处理过程
// 载入权限控制列表
// 判断resourcePath是否在权限控制列表
// 不在 表明resourcePath不被保护,返回true
// 在
// 判断用户是否有权限
return false;
}
public void destroy() {
}
}
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class PurviewFilter implements Filter {
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
HttpServletRequest req = (HttpServletRequest)request;
String userName =req.getRemoteUser();
String resourcePath= req.getRequestURI();
if(userName==null)
{
//没有登录用户处理
//return;
}
if(!verifyUser(userName,resourcePath))
{
//用户没有资源使用权限处理
// return;
}
chain.doFilter(request,response);
}
}
private boolean verifyUser(String userName,String resourcePath)
{
//在这里填写校验处理过程
// 载入权限控制列表
// 判断resourcePath是否在权限控制列表
// 不在 表明resourcePath不被保护,返回true
// 在
// 判断用户是否有权限
return false;
}
public void destroy() {
}
}
|
权限控制列表,可以有多种载入方式
如果是使用tomcat4以上版本的话,可以做一个bean,配置成JNDI Resources,这样就可以使用了,这是当前的流行做法。例如
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");
还有你可以在ServletContextListener建立一个控制列表对象,这样
你就可以读取了,这是我以前的用法。
如果是使用tomcat4以上版本的话,可以做一个bean,配置成JNDI Resources,这样就可以使用了,这是当前的流行做法。例如
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");
还有你可以在ServletContextListener建立一个控制列表对象,这样
你就可以读取了,这是我以前的用法。