100分!!关于SSH登陆和权限的问题~
流程是这样的: 《登陆—拦截器拦截—页面—根据权限显示对应的按钮操作》
我现在做到可以登陆到页面了,但是根据权限显示按钮还是不太会,帮忙改一下代码。
另外一个问题是,虽然有了登陆拦截,但是直接输入页面名字.jsp也可以进入,如何解决。
代码如下:
拦截器:
- Java code
public class AuthorizationInterceptor extends AbstractInterceptor { private static final String SC = "sc"; private static final String RELOGIN = "relogin"; protected Logger logger = LoggerFactory.getLogger(getClass()); public String intercept(ActionInvocation invocation) throws Exception { HttpSession session = ServletActionContext.getRequest().getSession(); /*String actionName = invocation.getProxy().getActionName(); System.out.println("actionName:"+actionName);*/ if (null != session.getAttribute(SC)) { System.out.println("拦截器:合法用户登录---"); logger.debug("拦截器:合法用户登录---"); return invocation.invoke(); } System.out.println("拦截器:用户未登录---"); logger.debug("拦截器:用户未登录---"); return RELOGIN; }}action:
- Java code
package com.action;public class UserinfoAction extends ActionSupport implements ModelDriven<Users>{ private static final long serialVersionUID = 1L; protected Logger logger = LoggerFactory.getLogger(getClass()); private static final String LOGINSUCCESS = "loginsuccess"; private Users userinfo; private UserinfoService userinfoService; //采用模型驱动 private Users model=new Users();//用于封装会员属性模型 public Users getModel() { return model; } public String login(){ logger.debug("login begin...."); String validateFlag = ""; HttpSession session = ServletActionContext.getRequest().getSession(); Assert.notNull(session); try { validateFlag = userinfoService.validateLogin(model, session); } catch (RuntimeException e) { System.out.println(validateFlag); logger.error("login validate error!"+e.getMessage()); addActionError("登录验证失败!"); return INPUT; } if(!LOGINSUCCESS.equals(validateFlag)) { addActionError(validateFlag); return INPUT; } session = ServletActionContext.getRequest().getSession(); SessionContainer sc = (SessionContainer)session.getAttribute("sc"); session.setAttribute("sc", sc); logger.info("session create success!"); return SUCCESS; } public String loginout(){ HttpSession session = ServletActionContext.getRequest().getSession(); Assert.notNull(session); SessionContainer sc = (SessionContainer)session.getAttribute("sc"); if(null!=sc){ session.removeAttribute("sc"); logger.info("session destroy success!"); } return SUCCESS; } /** 省略set/get */}xml:
- Java code
<interceptors> <interceptor name="authority" class="com.action.AuthorizationInterceptor"/> <interceptor-stack name="mydefault"> <interceptor-ref name="authority" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <!-- 默认拦截器 --> <default-interceptor-ref name="mydefault" /> <package name="login" extends="ssh"> <action name="login" class="UserinfoAction" method="login"> <result name="searchAll" type="redirectAction"> <param name="actionName">news_listNews</param> </result> <result>/index.jsp</result> <result name="input">/login.jsp</result> <result name="success">/index.jsp</result> <result name="login">/error.jsp</result> <interceptor-ref name="defaultStack" /> </action>
JSP , 就是这里,怎么根据登陆的权限显示 修改 和 删除 :
- HTML code
<s:form action="news_modiNews" method="post"> <s:submit value="修改" /> <input type="hidden" name="newsId" value="${result.newsId}"> </s:form> </td> <td> <s:form action="news_delNews" method="post"onsubmit="return confirmdialog()"> <s:submit value="删除" /> <input type="hidden" name="newsId" value="${result.newsId}"> </s:form>[解决办法]
登陆之后将相关信息放在session中,在页面进行判断是否有权限。
换句话说每个页面都要权限判断,方式用url方式登陆
[解决办法]
<s:form action="news_modiNews" method="post">
<s:submit value="修改" />
<input type="hidden" name="newsId" value="${result.newsId}">
</s:form>
</td>
<td>
<s:form action="news_delNews" method="post"onsubmit="return confirmdialog()">
<s:submit value="删除" />
<input type="hidden" name="newsId" value="${result.newsId}">
</s:form>
先在jsp页面的GBK那句代码下面
写上<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>这样一句
然后<c:if test="${id==2}"> <s:submit value="修改" /></c>
这样表示权限为2的时候显示修改这个button按钮
否则为隐藏
[解决办法]
<c:if test="${sc.model.rowid==1}"></c:if>
[解决办法]
根据session获取权限,然后在页面判断是否那个权限
还有直接用页面也可以是不是缓存的问题的,那个登陆的用户已经存在,不然默认的拦截器没配置好的
[解决办法]
兄弟,这种方法是最原始的方法了,只能在每个页面这样写if else判断了。推荐你去看一下江南白衣的springside,它利用spring Security思想做出的权限验证可以做到颗粒度判断。你随便在网上搜就一堆。功能十分强大。如果你有时间,就学习一下。希望对你有帮助。
[解决办法]
权限管理 数据库设计也很重要的 你得有个表存储系统的功能信息的,通过用户名密码查询到功能信息,存到session里面 在页面上取出来 我的思想基本上是这样的 或者还有种方法 把权限信息存session里面 在页面取出来 在修改 和删除按钮那加个if标签 判断下也行 不过个人推荐前面这种 后面这个不完美
[解决办法]
晕,浏览器关掉会触发一个方法,你在这个方法里面写清除session就好了
[解决办法]
session的生命周期和浏览器没有关系,并不是说关闭了浏览器,session就自动消失了。看下这个
http://topic.csdn.net/t/20040712/15/3167396.html
搜索一下session和浏览器的关闭的关系看看。你点击退出登录的时候session没了 是因为点击的时候执行了session.removeAttribute(String name) //删除在session对象中由name指定的对象
或者session.removeValue(String name)方法。
[解决办法]
删除会话的话 执行session.invalidate(),那么所有储存在session中的对象都被清空了。
[解决办法]
流程是这样的: 《登陆—拦截器拦截—页面—根据权限显示对应的按钮操作》
我现在做到可以登陆到页面了,但是根据权限显示按钮还是不太会,帮忙改一下代码。
另外一个问题是,虽然有了登陆拦截,但是直接输入页面名字.jsp也可以进入,如何解决。
=============================
我看你代码写的挺对的只是有一点问题
不要把你的jsp直接放在webcontent下面
<result name="input">/login.jsp</result>
类似这样的
<result name="success">/Struts2Sample/main.jsp </result>
自己建一个子文件夹,这样IE里直接输入jsp名字就进入不了了
[解决办法]
用session判断登录,但是只要不手动点 退出系统 ,那么关闭浏览器再打开session还在,不需要重新登录,这个问题怎么办。。
========================
这个问题按理说不会这样吧,session信息是存在服务器端的,关闭了浏览器服务器器端确实不会立即清除该用户的session信息。
但是客户端再次打开浏览器的时候,会给服务器端重新发一个sessionID也就是说服务器端会当作一个新的链接来处理,不会找到上一次的session信息。除非在本地保留了前一次的sessionID并提交给了服务器。
[解决办法]