权限控制的实现

     权限管理,一般指通过在系统中设置的安全策略,用户可以访问而且只能访问自己被授权的系统资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。 因此很多人,常将“用户身份认证”、“密码加密”、“系统管理”等概念与权限管理概念混淆。

     本篇文章主要说的是网站的权限管理实现,通过过滤URL或控制方法执行来进行限制。

     通过利用Filter,对所有进入的URI进行解析,并取得当时Session中的User信息,然后通过RBAC的机制,将此链接需要的权限与用户拥有的权限进行比较,然后进行相应的处理。这种做法有很多好处:简单,容易实现,并且对系统侵入性也不强。这里URL就是RBAC中的资源了。这样做的缺点是所有对数据的操作必须通过URL来体现,这一点在现代的程序中不太好实现。如果采用Struts, XWork或者Tapestry,采用同一个URL(浏览器看来)进行处理多项任务已不是什么稀奇的事。这时候同一个url里功能对应的角色不同,就不能通过URL过滤了。
     通过AOP控制,在上一篇中就有提到,通过使用AOP可以精确控制到每一个执行方法的权限,也就是说小到一个按钮触发的业务也可以进行控制,并且由于AOP的切面管理可以对每一个细节功能做到方便的调配。不过AOP无法做到像Filter那样对网页进行过滤,只能对网页中的每一个细节功能进行控制,所以某种程度上来说Filter和AOP结合可以让权限管理得到最大的灵活度。

浅谈面向切面编程

     Aspect Oriented Programming(AOP),即面向切面编程,是前段时间比较是一个比较热门的话题,在学校老师给我们讲OOP的时候,就经常提到它。面向切面编程主要实现的目的是针对业务处理过程中的切面提取,它所面对的是某个步骤或阶段的统一处理过程,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们上星期完成的日志记录和权限管理就采用了这一技术。
     我们举个简单的列子,我们现在提供一个服务修改订单信息的,但是我们希望记录有谁进行了这个操作。那我们实现了一个订单的服务接口和其实现类,同时为了要进行记录的话,那我们在实现类中就要添加其实现记录的过程。这样的话,假如我们要实现的服务有多个呢?那就要在每个实现的类都添加这些类似且重复的记录过程。这样做的话就会有点繁琐,而且每个实现类都与记录服务日志的行为紧耦合,违反了面向对象的规则。那么怎样才能把记录服务的行为与业务处理过程中分离出来呢?看起来好像就是修改订单的服务自己在进行,但却是背后日志记录对这些行为进行记录,并且修改订单的服务不知道存在这些记录过程,这就是我们要讨论AOP的目的所在。
     下面介绍一些AOP的概念,方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。目标对象:包扩连接点的对象,也被称作被通知或被代理对象。
     切入点的概念是AOP的关键,它使AOP区别于其他使用拦截的技术。切入点使通知独立于OO的层次选定目标, 拦截器也由此应运而生,目前我们使用的是基于JAVA的集成到Spring 中的 SpringAOP,用此来实现了日志和权限的统一管理。

primefaces 学习心得

     做了挺长一段jsf的开发了,这期间,我们用jsf的PrimeFaces实现了我们以前不敢想的UI,不得不说PrimeFaces给我们带来了意想不到的福音。 PrimeFaces是一个用于提高JSF Web应用程序开发效率的开源类库,通过它,可以让UI直接和后台对接,它提供了丰厚的ui库,简单易学的案例,方便上手,而且还省去了css和图片的设计时间,是一个很强大的开源类库。
     PrimeFaces主要由三个模块组成:第一个是UI Components,PrimeFaces的 UI模块提供了拥有Rich Web用户体验的各种JSF组件,如可即时编辑的datatable、绚丽的日期选择器、便利炫彩的上传下载控件等等,如果要用javascript去实现,必当要花相当多的时间,有了FacesTrace模块,我们可以轻松的使用这些UI。PrimeFaces使用Yahoo UI库做为默认的客户端框架。PrimeFaces提供的JSF组件能够处理JavaScript Rendering,并且处理如何在服务器端与JSF集成,实现点对点连接。PrimeFaces UI组件还包括:HtmlEditor、ImageCropper、Dialog、AutoComplete、Flash based Chart等。基本上页面需要的控件都有了,最重要都是,它还支持通过Ajax更新页面,这在性能上,和用户体验上可以说是相当重要的。第二个模块是Optimus,Optimus提供简化JSF开发的解决方案。Optimus提供基于Google Guice IOC容器的注释来代替XML配置和一个XML-less Navigation Handler能够让你减少基于XML配置JSF Navigation的需要,只需要简简单单的注解,你就可以实现对页面的控制。此外Optimus还支持利用JPA实现数据持久化;只需几个标签,你就可以将DataTable的内容导出成Excel与PDF。而且它支持安全扩展。第三个FacesTrace模块,因为目前我们做的项目对FacesTrace模块还不是非常了解,这里只做简单介绍,FacesTrace模块提供跟踪JSF Web应用程序的各种工具包括:JSF LifeCycle可视化查看器;性能跟踪器; Log4J适配器;FacesMessage监听器;组件树可视化查看器等。
     虽然PrimeFaces相当出彩,可惜使用的人视乎很少,很难找到资料学习,现在基本上都是靠自己用官网的资料来学习,有不少兼容性的问题,项目结束以后在和大家分享。

javascript在翻译领域中应该注意的问题(二)

七:JS的运算语句

    和其他的编程语言一样,在JS也有基本的运算语句,而这些语句都是开发过程中惊经常出现的,所以在翻译的过程中,如果遇到如下的一些语句包起来的单词,说明它是一段完整的程序,我们则不需要进行翻译。

1.条件语句:

if语句,例如:if(这是条件判断) {……这里是判断通过后要执行的代码}

if…else 语句, 例如:

if(){

} else{

}

if…else if….else 语句,例如:

if() {

} else if() {

} else {

}

switch 语句 ,例如:switch(n)

{

case 1 : 执行代码1 break;

case 2 : 执行代码2 break;

}

    此处需要补充一下的是“break” 是这些运算语句中的一个关键字,如果它出现在这些运算语句中内的话,他是不需要翻译的,如果是其他地方单独出现的话,则需要翻译,除了“break”外,在这些语句中还会有可能出现“continue”也是一样的。

2.循环语句:

JS支持不同类型的循环:

1.for :语法 for(语句1;语句2;语句3){ 被执行的代码块 }

2.for/in :例:var person={name:”john”,sex:”man”};

for(x in person) {

  txt = txt + person[x]

}

3.while: 例,while( i < 5) {

  执行代码段

}

4.do/while 例,do() {x = x + “a” } while (i < 5)

八:JS错误-Throw,Try,和Catch

    在开发的过程中,程序和代码的运行出现一些异常和错误是在所难免的,因此JS和其他的语言一样有抛出和捕获异常的一些特殊语句和关键字。在翻译中若遇到这些特殊语句和关键字的时候可直接不翻译他的意思,或者只说明一下这是异常捕获程序。下面列一下这些语句的格式,供参考一下。

1.JS 测试和捕捉

try 语句允许我们定义在执行时进行错误测试的代码块。

catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。

JavaScript 语句 try 和 catch 是成对出现的。例如:

try {

      //这里执行运行的代码

} catch () {

      //这里处理出现的错误

}

2.Throw 语句

throw 语句允许我们创建自定义错误。

正确的技术术语是:创建或抛出异常(exception)。

如果把 throw 与 try 和 catch 一起使用,那么您能够控制程序流,并生成自定义的错误消息。例:

try {

        if(x=="")    throw "empty";
         if(isNaN(x)) throw "not a number";
        if(x>10)     throw "too high";
        if(x<5)      throw "too low";

      //这里执行运行的代码

} catch () {

      //这里处理出现的错误

}

    以上的这两篇博客就是我对JavaScript在翻译过程中应该注意的问题的一些见解了,由于JS这个脚本语句博大精深,功能之强大,涉及的范围也很广。所以如果在文中有理解不到位或者错误的地方,欢迎读者指出和更正。如果内容上还有待补充的话,也请大家一起交流和探讨,共同进步。

Primefaces UI使用小结

相较于Struts、SpringMVC等MVC框架,在国内的企业应用中JSF的使用确很少,或许是因为资料很少又或许是我们对它的认知不够,但有一点不可否认,JSF是被纳入Java EE 5规范的,而其它的却没有。之前使用JSF做过几个项目,但这是第一次使用Primefaces UI(它是基于JSF Mojarra实现的一套很强大的UI,有社区版和商业版),因为在使用过程中碰到很多“坎”,所以想写篇博客将碰到的问题总结下,也希望能帮助到想使用或正在使用Primefaces UI的人。

        Primefaces UI在百度上基本搜不到有价值的信息,在整个解决问题的过程中Google(记着要切换到英文去搜哦)帮了很大的忙,它在国内用的人就更少了。但回过头去看,我真的很愿意向大家推荐这款UI,超级赞!我目前使用的版本是Primefaces 3.5和JSF Mojarra-2.1.17,废话少说进入正题。
一、ManagedBean的Scoped
        1、RequestScoped
        2、ViewScoped
        3、SessionScoped
        4、ApplicationScoped
        Request、Session、Application大家都比较熟悉,就不多说了,ViewScoped顾名思义视图有效,或者说当前页有效,因为Servlet规范里并没有View这个概念,所以它是JSF延伸出的一个概念,个人理解是为Ajax准备的,大家一定要记住它哦,后续它可发挥了很大的作用。
二、Primefaces
       1、template的使用
       在现在Web开发中,特别是Ajax出现后,framesetframeiframe已经不是特别推荐使用了(当然也可以使用),牛人可以用DIV构建出任何想要的布局,像我们这些平民懂的分享牛人的成果就OK了,在Primefaces里我们可以用p:layout布局,并做成template,后面的每个页面只要继承这个template,就可以直接享用,如下图
        2、ViewScoped的使用
        这个很重要,在项目开始时,因为SessionScoped的生命周期太长了不想用,所以大部分的ManagedBean都是用的RequestScoped,问题是一个接一个,如p:commandButton和p:commandLink的action和actionListener莫名其妙的不可进入,Ajax的使用也有时可以有时不可以,Scoped换成Session就一切都OK了,发现跟Bean的生命周期有关系,最后调试完,发现用ViewScoped最合适,生命周期比Request长比Session短,同时又能解决上述问题,因为Primefaces UI里大量用到ajax通信,这种场景最适合用ViewScoped。
        3、form的使用
        在使用中一定要避免form嵌套form的情况,它会出现很多不可以预知的情况,如提交附件会出现问题,但并列form可以放心的使用
        4、tree的使用
        如上图的Left中可以放置一个树形菜单,使用过的人可能会和我碰到一样的问题,那就是当我打开一个新页面时,树形菜单不能保持我打开页面之前的状态,解决方法:负责树形菜单Node节点的Bean的Scoped要申明成SessionScoped,并在tree标签上加属性dynamic=”true”,如<p:tree value=”#{menuBean.root}” var=”doc” dynamic=”true”>
        5、confirmDialog的使用
        如果在使用confirmDialog时发现,弹出框被遮罩层给挡住了不可使用,怎么办?解决方法:在confirmDialog标签加属性appendToBody=”true”,如<p:confirmDialog widgetVar=”startConfirm” appendToBody=”true” message=”Are you sure about starting the project?” header=”Start project” severity=”alert”>
        6、dialog的使用
        不得不提的一个组件,超级好用,我的应用里大量用到了它,它用起来让你的Web应用就像是一个Client应用,交互性和用户体验非常的好。你可以将dialog当作一个提示框用,也可以在dialog里做一个复杂的表单,你可以选择遮罩也可以不使用,如果要使用遮罩只需加上属性modal=”true”
        7、panelpanelGridoutputPanelaccordionPaneltabView等的使用
        他们都是布局展现相关的,用好来,效果非常的好,当然还有其它的。
        8、process和update属性的使用
        前面说了Primefaces大量用到了Ajax,那就不得不提process和update,他们俩刚好相反,process指出要异步提交哪一部分的内容,update指出要异步更新哪一部分的内容,经常在一起配合使用。功能非常的强大,如果有兴以后可以再详细说说。
        9、fileUpload的使用
        在使用前要在Web.xml中加入如下部分:
      <filter>
            <filter-name>PrimeFaces FileUpload Filter</filter-name>
            <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
      </filter>
      <filter-mapping>
            <filter-name>PrimeFaces FileUpload Filter</filter-name>
            <servlet-name>Faces Servlet</servlet-name>
      </filter-mapping>
        使用p:fileUpload的form必须加上属性enctype=”multipart/form-data”,而且它不支持Ajax异步提交,所以对应的command要加上属性ajax=”false”,如:
      <h:form id=”form-delivery-file” enctype=”multipart/form-data”>
           <p:panelGrid columns=”2″>
               <p:outputLabel value=”Delivery File: ” />
               <p:fileUpload id=”deliveryFile” value=”#{projectBean.deliveryFileFromUi}” mode=”simple” storage=”file” />
           </p:panelGrid>
           <p:commandButton value=”Submit” ajax=”false” style=”margin:0″ actionListener=”#{projectBean.deliveryFile}” />
      </h:form>
        由于时间问题,这次先写到这,还有很多好用的组件,及在深入使用过程中碰到的问题和解决方法,后续再道来。想了解的朋友可以先到Primefaces的官方网站一睹为快:http://www.primefaces.org/showcase/ui/home.jsf

浅谈组件化开发

    这段时间开始新项目的开发,这次开发我们使用的是组件化开发,把每一个功能模块分成不同的组件,实现即插即拔的效果。
    目前的组件技术主要以Activex、Corba、VCL、EJB为代表,他们都实现了可拔插、可替换的功能,提供了分布式计算服务,甚至可视化控件,大大提高了开发效率和维护性。通过引入组件化的思想,安业务需求分成各个实现单元,然后将其包装成可独立部署的组件,通过组件的灵活组装,达到最大化的复用,并可以快速的应对需求变化。同时通过组件化降低系统内部的耦合度,组件化为系统运行维护期的可管理性和可维护性提供技术上的支持。
    很多行业的发展都与当时的技术背景和发展状况有着直接或间接的关系,但是 软件就其本身特征而言更加具有复杂性,它从一开始应用于简单计算到现在渗透 到各行各业,与传统行业相比,无论从外延还是解决问题的复杂性,都有它的独特性。业界的技术发展在几十年经历了面向机器、面向过程、面向对象、面向组 件的发展历程,每个阶段较前一个阶段在关注点和思维层次上都有一定的升华, 都解决了某类问题,为当时的软件发展起到了重要作用。
下面说说组件化的特点:
    1)组织和过程 为保证技术组件的通用性、适合度和质量,需要建立组件评审机制,负责对 技术组件的验证、评审。在流程上,需要建立技术组件立项、研发、测试、评审、 入库、推广的过程管理。
    2)应用场景 在新应用系统丌发前,设计师需要根据项目特点,从技术组件库中检索出适 合的技术组件,并确定技术组件的版本,导出组件包,统一在项目中使用。为了 提高组件重用率,设计师应优先使用技术组件库提供的组件包,而不是采用代码 级复用的方式。 针对新丌发的技术组件,组件设计和开发者必须按照技术组件规范要求,提 供技术组件的源代码、二进制组件包以及自描述信息,包括适用范围、功能描述、 版本、作者、依赖关系、接口描述等。并按技术组件开发过程的要求,提交到技 术组件库中。
    3)技术组件库 技术组件库是一套单独的应用,技术组件的管理是通过技术组件库来实现 的。
    总之,通过组件化,可以极大的实现重用性, 提高开发效率,快速灵活应对业务需求,通过降低耦合度提升系统的可管理性, 从而降低维护成本,是一个高可靠的开发方案。

组件化开发模型

jsf的学习心得

     学习了一段时间的jsf,感觉到jsf是一个非常好的框架,只可惜在国内却有非常少的资料提供学习,现在分享这段时间我学习jsf的一点心得

     Jsf是组件式的开发,组件是Struts和JSF之间最大的区别。就像Swing一样,JSF提供丰富的底层构件去开发组件然后添加到标准的组件集。那些底层构件让你很容易的生成自己的组件并且和别人共享。现在我们到处都能看到自定义组件跳出来,比如说Oracle的ADF和MyFaces,两者都提供了丰富的组件集,就像javascript日历,tree等等。

     当然,组件只是一部分。典型的是,组件都和一个独立的renderer对应,这给我们带来了真正的好处(看第3条)。但是和JSF中的很多东西一样,你不一定要墨守成规。只要你愿意,你可以实现render自己的组件,虽然这样你会失去给组件加入别的renderer的能力。

     你有看过Struts的标签的源代码吗?它直接生成HTML。JSF组件标签什么都不生成,它和服务器上的一对component-renderer对应。Component维护组件状态,rendered负责获得视图。重点是renderers是可插拔的,即你可以根据自己需求实现然后替代掉默认实现。比如说我在NFJS上面的Felix谈话中举例说明了怎么去实现一个自定义的label renderer。你只需要配置你的renderer,JSF就会自动在你的应用程序里面使用他。 这使得开发非常的快速便捷。

     Struts是一个开源产品,然而JSF是一个标准。这个细节常常被新的JSF学习者忽略,其实这是显而易见的,因为我们有多个JSF的实现。虽然JSF还很不成熟,但是我们已经有了2个优秀的JSF实现可以选择:Sun的参考实现和Apache的MyFaces。另一方面,我们只有一个Struts。

基于springAOP注解实现日志功能

   最近准备开始新项目,在项目启动前,我们的架构师分配了个任务给我,利用spring的切面技术做一个日志管理的案例。要求很简单,就是需要记录:谁在什么时候对谁做了什么操作,同时在日志的描述中还要有修改前后内容的对比。话说两句话是挺简单的,但是对于对spring只有初学者水平的我还是有点难度的,于是各种百度,各种谷歌,各种想。终于在这篇http://kaowww153.iteye.com/blog/603891博客中得到启发,但是里面的内容写的还是不够完整,和我的需求也有些不一样。经过多次的修改和测试,终于成功通过。今天闲来无事,写个博文,以备下次需要做好笔记。话不多说,把过程写下:

1.首先创建一个自定义注解,如下:

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

public @interface RecordLog {
}
2.写一个过滤方法,这个方法是实现MethodIntherceptor接口的invoke方法

public class LogAroundInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
return returnObject;
}
3.在springapplicationContext.xml文件里需要对我们的切面和注解进行配置。
<bean id=”common” class=”com.cstp.jdbc.test.Common”>
</bean>
<aop:config>
<aop:pointcut id=”logPointCuts”
expression=”execution(* com.cstp.jdbc.test.*.*(..))” />
<aop:advisor pointcut-ref=”logPointCuts” advice-ref=”springMethodInterceptor” />
</aop:config>
<bean id=”springMethodInterceptor” class=”com.cstp.custom.interfaces.LogAroundInterceptor”>
</bean>
</beans>
4.我的实体类common
@RecordLog
public void update(User user, User opeartor, HttpServletRequest request) {
UserDao userDao = new UserDaoImpl();
userDao.updateUser(user);
System.out.println(“修改成功“);
}

5.servlet测试
UserDao userDao = new UserDaoImpl();
BeanFactory factory = new ClassPathXmlApplicationContext(“applicationContext.xml”);
Common c = (Common) factory.getBean(“common”);
User user = new User();
user.setId(2);
user.setName(““);
user.setPassword(“123456”);
user.setAge(18);
user.setSex(““);
User opeartor = userDao.findAllUserById(3);
User oldUser = userDao.findAllUserById(2);
HttpSession session = request.getSession();
session.setAttribute(“oldUser”, oldUser);
c.update(user, opeartor, request);

测试结果:成功获得我所需要的新旧对象,以及操作人,时间,描述等都可以在getSysLog()方法中获取,至于如何添加就简单啦,就不写上了。
6.使用方法很简单了:在需要添加日志的方法上加上我们的注解@RecordLog就可以了(就像我common类里的update方法一样)。

浅谈如何解决javascript对seo的影响

前面一篇文章说了,javascript给我们带来很多的好处,但是它却是搜索爬虫的一道墙,对网站的seo非常不利。那么怎么在不影响网页效果而又对搜索引擎友好的前提下使用JavaScript,又不影响SEO效果呢?
  1、要避免导航及网页链接使用JavaScript。导航和链接是搜索爬虫抓取网页的赖以生存之本,如果搜索爬虫无法抓取网页,则代表了网页不会出现在索引结果中,也就没有排名了。如果有希望蜘蛛抓取的目标页面需要转向,不要使用javascript脚本进行跳转,因为这样做的话蜘蛛完全无法获取到目标页面的地址,采用noscript标记进行目标url指定是一个好办法,因为蜘蛛能够正确识别noscript标记,并且一般情况下不会对浏览器显示产生影响。
  2、尽量避免用JavaScript输出内容。特别是与关键词相关部分的内容,尽可能避免使用JavaScript来展现,否则毫无疑问是要降低关键词密度的。虽然ajax是一个好技术,尤其是在一些需要实时性要求比较高的系统中,可以很好的缓解服务器的压力,也可以实现需求时才查询取出数据内容,还可以对框架布局不产生影响,实现更炫的网页效果,但ajax的核心是通过javascript脚本来在需要时获取数据的技术,这样数据就不是在页面展示时就加载完成,那么就出现了第一项中所说的,蜘蛛获取不到这些内容,自然就无法抓取和爬行链接。本项内容可以参考“AJAX技术与SEO”和“QQ空间不能用来做SEO外链”。
  3、如果上面两项无论如何都要坚持的话,也不是不行,可以做两套ui,一套有丰富的javascript供用户体验,另一套则为搜索引擎提供爬取支持,但这对维护来说就增加了非常大的难度。
以上的一些方法是消除JavaScript对搜索引擎的不利影响,搜索引擎无法对JavaScript进行识别(虽然Google目前能够做到对少量简单的JavaScript代码做出辨别,但那也应该只是Document write之类的简单代码)。那么换一个角度来说,我们完全可以利用JavaScript来过滤一些垃信息。

浅谈javascript对seo的影响

     Javascript是一种客户端脚本语言,主要目的是为了解决服务器端语言遗留的速度问题,为客户提供更流畅的浏览效果,Javascript不仅仅可以减轻系统的负担,还可以提供各种各样华丽的特效,人性化的交互,几乎所有大型网站都用到了javascript。
     然而JavaScript却在SEO中是一个很头疼的问题,一方面我们在网页制作中需要使用JavaScript来实现绚丽的特效,而一方面JavaScript又会对搜索引擎的抓取分析造成不好的影响。Google的官方文档中很清楚的说明,如果在html中过多的使用 JavaScript、Cookie、会话 ID、框架、DHTML 或 Flash 等复杂功能会使搜索引擎抓取工具在抓取网站时可能会遇到问题。百度虽然没有明确的说明,但是经过大量的实践,百度也是无法对JavaScript进行识别的。这样就有一个问题,网页中过多的JavaScript代码无疑是对搜索引擎分析网页内容增加难度。如果网页中的链接已经主体内容也是由不少JavaScript组成输出的话,那么搜索引擎甚至无法顺着链接去抓取网页,也无法获取网页内容。这样的话,过多的使用JavaScript就造成了以下的影响:
     1、对搜索引擎分析网页内容造成了干扰。2、严重妨碍搜索引擎抓取网页。3、影响由链接产生的网页权重分布。
     总之Javascript给我们带来很多好处的时候,也对搜索引擎带来很大阻碍,所以我们要仔细考虑如何让Javascript和seo怎么更好的合作。