spring配置该方法只读了。
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="affirm*">PROPAGATION_REQUIRED</prop>
<prop key="gen*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="process*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="send*">PROPAGATION_REQUIRED</prop>
<prop key="upload*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property></bean>
Class search path
The default ClassPool
returned by a static method ClassPool.getDefault()
searches the same path that the underlying JVM (Java virtual machine) has. If a program is running on a web application server such as JBoss and Tomcat, the ClassPool
object may not be able to find user classes since such a web application server uses multiple class loaders as well as the system class loader. In that case, an additional class path must be registered to the ClassPool
. Suppose that pool
refers to aClassPool
object:
pool.insertClassPath(new ClassClassPath(this.getClass()));
This statement registers the class path that was used for loading the class of the object that this
refers to. You can use any Class
object as an argument instead ofthis.getClass()
. The class path used for loading the class represented by that Class
object is registered.
You can register a directory name as the class search path. For example, the following code adds a directory /usr/local/javalib
to the search path:
ClassPool pool = ClassPool.getDefault(); pool.insertClassPath("/usr/local/javalib");
The search path that the users can add is not only a directory but also a URL:
ClassPool pool = ClassPool.getDefault(); ClassPath cp = new URLClassPath("www.javassist.org", 80, "/java/", "org.javassist."); pool.insertClassPath(cp);
This program adds "http://www.javassist.org:80/java/" to the class search path. This URL is used only for searching classes belonging to a package org.javassist
. For example, to load a class org.javassist.test.Main
, its class file will be obtained from:
http://www.javassist.org:80/java/org/javassist/test/Main.class
Furthermore, you can directly give a byte array to a ClassPool
object and construct a CtClass
object from that array. To do this, use ByteArrayClassPath
. For example,
ClassPool cp = ClassPool.getDefault(); byte[] b = a byte array; String name = class name; cp.insertClassPath(new ByteArrayClassPath(name, b)); CtClass cc = cp.get(name);
The obtained CtClass
object represents a class defined by the class file specified by b
. The ClassPool
reads a class file from the given ByteArrayClassPath
if get()
is called and the class name given to get()
is equal to one specified by name
.
If you do not know the fully-qualified name of the class, then you can use makeClass()
in ClassPool
:
ClassPool cp = ClassPool.getDefault(); InputStream ins = an input stream for reading a class file; CtClass cc = cp.makeClass(ins);
makeClass()
returns the CtClass
object constructed from the given input stream. You can use makeClass()
for eagerly feeding class files to the ClassPool
object. This might improve performance if the search path includes a large jar file. Since a ClassPool
object reads a class file on demand, it might repeatedly search the whole jar file for every class file. makeClass()
can be used for optimizing this search. The CtClass
constructed by makeClass()
is kept in the ClassPool
object and the class file is never read again.
The users can extend the class search path. They can define a new class implementing ClassPath
interface and give an instance of that class to insertClassPath()
inClassPool
. This allows a non-standard resource to be included in the search path.
package com.cloud.dm.util;
import java.io.File;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.bytecode.DuplicateMemberException;
import org.apache.commons.lang3.StringUtils;
public class Struts2GetterSetterGen {
private static ClassPool pool = ClassPool.getDefault();
public static void init() throws Exception {
URL url = Struts2GetterSetterGen.class.getResource("/");
List<File> resultList = new ArrayList<File>();
FileSearcher.findFiles(url.getFile(), "*Action.class", resultList);
for (File object : resultList) {
String className = StringUtils.substringBetween(object.toString(),
"classes\\", ".class").replaceAll("\\\\", ".");
CtClass ct = null;
pool.insertClassPath(new ClassClassPath(Class.forName(className))); //在servlet容器中启动
ct = pool.get(className);
Field[] fs = Class.forName(className).getDeclaredFields();
for (Field f : fs) {
genGetter(ct, f);
genSetter(ct, f);
}
ct.writeFile(url.getPath()); // 覆盖之前的class文件
}
}
private static void genGetter(CtClass ct, Field field) throws Exception {
String string = "public " + field.getType().getName() + " get"
+ StringUtils.capitalize(field.getName()) + "() {return "
+ field.getName() + "; }";
CtMethod m = CtNewMethod.make(string, ct);
try {
ct.addMethod(m);
} catch (DuplicateMemberException e) {
}
}
private static void genSetter(CtClass ct, Field field) throws Exception {
String string = "public void set"
+ StringUtils.capitalize(field.getName()) + "("
+ field.getType().getName() + " " + field.getName() + "){this."
+ field.getName() + " = " + field.getName() + "; }";
CtMethod m = CtNewMethod.make(string, ct);
try {
ct.addMethod(m);
} catch (DuplicateMemberException e) {
}
}
}
摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 1 <dl>
2 &nbs...
org.apache.shiro.web.filter.mgt.DefaultFilter
默认的内置拦截器
anon(AnonymousFilter.class),
authc(FormAuthenticationFilter.class),
authcBasic(BasicHttpAuthenticationFilter.class),
logout(LogoutFilter.class),
noSessionCreation(NoSessionCreationFilter.class),
perms(PermissionsAuthorizationFilter.class),
port(PortFilter.class),
rest(HttpMethodPermissionFilter.class),
roles(RolesAuthorizationFilter.class),
ssl(SslFilter.class),
user(UserFilter.class);
anno 允许匿名访问,
Filter that allows access to a path immeidately without performing security checks of any kind.
This filter is useful primarily in exclusionary policies, where you have defined a url pattern to require a certain security level, but maybe only subset of urls in that pattern should allow any access.
For example, if you had a user-only section of a website, you might want to require that access to any url in that section must be from an authenticated user.
Here is how that would look in the IniShiroFilter configuration:
[urls]
/user/** = authc
But if you wanted /user/signup/**
to be available to anyone, you have to exclude that path since it is a subset of the first. This is where the AnonymousFilter ('anon') is useful:
[urls]
/user/signup/** = anon
/user/** = authc
>
Since the url pattern definitions follow a 'first match wins' paradigm, the anon
filter will match the /user/signup/**
paths and the /user/**
path chain will not be evaluated.